package com.tedu._04mybatis.mapper;

import com.tedu._04mybatis.pojo.User;
import com.tedu._04mybatis.pojo.UserVO1;
import org.apache.ibatis.annotations.Mapper;
/**
 *  首先当前Mapper接口需要让MyBatis提供对应的实现类，因此需要在当前接口上
 *  使用MyBatis提供的注解:@Mapper
 *
 *  SpringBoot启动时，会调用MyBatis提供的starter，这里MyBatis就会扫描当前项目中
 *  所有被@Mapper标注的接口，并提供实现类(怎么实现的？？？答:动态代理 CGLIB)
 *  并且根据该接口中的方法上注解来具体实现对应方法的逻辑
 *  例如:
 *  @Insert:实现方法会执行该注解中的SQL语句完成插入操作。
 *         MyBatis要求的预编译SQL格式不是用"?"表示值，而是用"#{}"
 *         原因是它需要直到原本?对应的是方法传入对象的那个属性的值
 *
 *         好比我们原来自己用JDBC:
 *         标准的预编译SQL，用"?"代表值
 *         String sql = "INSERT INTO user(username,password,nickname,created) " +
 *                      "VALUES(?,?,?,?)";
 *         PreparedStatement ps = connection.preparedStatemen(sql);
 *
 *         我们自己需要硬编码，告知每一个?用的是方法传入的user对象那个属性的值
 *         ps.setString(1,user.getUsername());
 *         ps.setString(2,user.getPassword());
 *         ps.setString(3,user.getNickname());
 *         ps.setDate(4,user.getCreated());
 *
 *
 *         然后使用MyBatis后，预编译SQL写为：
 *         INSERT INTO user(username,password,nickname,created)
 *         VALUE (#{username},#{password},#{nickname},#{created})
 *
 *         其中#{username}就是用于告知MyBatis应当将方法传入的user对象的username
 *         属性的值
 *         因此"#{}"这里"{}"中要填写的是方法传入的对象对应的属性名
 *         本案例:
 *         int insert(User user);
 *
 *         那么#{username}就是告知MyBatis用insert方法传入的user对象的username
 */
@Mapper
public interface IUserMappers {
   int insert(User user);

   int dynamicUpdate(User user);

  UserVO1 selectById(Integer id);
}
